<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Validator;

class BaseController extends Controller
{
    public $common;

    /**
     * 发送的数据格式
     *@param  $data 返回的参数
     *@param  $msg 返回的文字信息
     *@param  $code 返回的状态码 200成功 有数据  204 成功 无数据  404数据不存在
     */
    public function responseData($data = [], $msg = "", $code = 200): Response
    {
        $result = [
            'code' => $code,
            'message' => $msg,
            'data' => $data
        ];

        return response($result);
    }

    /**
     *错误日志 写进 storage/logs/error.log
     *@param  $fileName 出错的文件
     *@param  $fileLine 出错的文件的错在行数
     *@param  $error 错误信息
     */
    public function error_log($fileName, $fileLine, $error)
    {
        $errorStr = "\n错误文件：$fileName\n错误行：$fileLine\n错误信息：$error\n";
        Log::channel('error')->error($errorStr);
    }

    /**
     * 查询数据是否存在
     *@param  $modelClassName 模型类名
     *@param  $column 通过什么字段查询
     *@param  $error 查询的值
     */
    public function dataExists($modelClassName, $column, $value)
    {
        return $modelClassName::where($column, '=', $value)->exists();
    }

    /**
     * 手机号检测
     */
    function checkPhoneNumber($str)
    {
        return preg_match('/^1[3456789]\d{9}$/', $str);
    }

    /**
     *邮箱检测
     */
    function checkEmail($str)
    {
        return filter_var($str, FILTER_VALIDATE_EMAIL) !== false;
    }

    /**
     * 用于判断 字符串是什么类型
     *  目前类型：
     *      手机号
     *      邮箱
     *      后续可以继续添加...
     * @param string $str 待判断的字符串
     * @return string 返回字符串的类型，可能的取值包括：
     *   - 'phone' 表示手机号
     *   - 'email' 表示邮箱
     *   - 'unknown' 表示未知类型
     *
     */
    public function checkStrType($str)
    {
        $typeChecks = [
            'phone' => 'checkPhoneNumber',
            'email' => 'checkEmail',
            // 添加更多的类型检查
        ];
        foreach ($typeChecks as $type => $checkFunction) {
            if ($this->$checkFunction($str)) {
                return $type;
            }
        }
        return 'unknown';
    }

    /**
     * 参数验证
     * 弃用 暂时
     * @param array $params 参数数组
     * @param object $rule 验证的规则
     *      leg：['name' => 'required']
     */
    public function validateParams($params, $rule)
    {
        $validator = Validator::make($params, $rule);
        if ($validator->fails()) {
            return $this->responseData([], $validator->errors(), 400);
        }
        return true;
    }
}
